package com.example.pasajero;

import utils.BaseAsync;
import utils.PreferencesHelper;
import controladores.ControladorPasajeros;
import entidades.Favorito;
import entidades.PuntoGeografico;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class RegistroFavoritoActivity extends Activity
{
	private Boolean localizo = false;

	private LocationManager locManager;
	private LocationListener locListener;
	
	private Favorito favorito;
	
	private EditText campoDireccion;
	private EditText detalle;
	
	private TextView estado;

	private Location loc;
	
	private double latitud;
	private double longitud;
	
	

	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_registro_favorito);
		
		localizo = false;
		
		estado = (TextView) findViewById(R.id.textViewEstado);
	
		campoDireccion = (EditText) findViewById(R.id.editText_direccion);
		detalle= (EditText) findViewById(R.id.editText_detalle);
		
		estado.setText("No Localizando");
		
		comenzarLocalizacion();
		
		favorito = new Favorito();
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu)
	{
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.registro_favorito, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item)
	{
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.action_settings)
		{
			return true;
		}
		return super.onOptionsItemSelected(item);
	}
	
	public void localizar(View v)
	{
		comenzarLocalizacion();
	}
	
	public void guardar(View v)
	{
		AlertDialog alertDialog = new AlertDialog.Builder(this).create();
		PuntoGeografico punto = getPunto();
		if(punto != null && detalle.getText().toString().trim().length() > 0)
		{
			favorito.setNombre(detalle.getText().toString());
			favorito.setPunto(punto);
			new AgregarFavorito(favorito).execute();
		}else{
			alertDialog.setTitle("Error");
			alertDialog.setMessage("Faltan datos");
			alertDialog.show();
		}

	}
	
	private void mostrarAvisoGpsDeshabilitado()
	{
		AlertDialog alertDialog = new AlertDialog.Builder(this).create();
		alertDialog.setTitle("Error");
		alertDialog.setMessage("GPS no habilitado.");
		alertDialog.show();
		estado.setText("No Localizando");
	}
	
	private void mostrarPosicion(Location loc)
	{
		estado.setText("localizado");
		
		if (loc != null)
		{
			PuntoGeografico punto = new PuntoGeografico(loc.getLatitude(),
					loc.getLongitude());
			
			this.latitud = punto.getLatitud();
			this.longitud = punto.getLongitud();


			Log.i("LOG",
					String.valueOf(loc.getLatitude() + " - "
							+ String.valueOf(loc.getLongitude())));
			localizo = true;
		} else
		{

			localizo = false;
		}
	}
	
	private PuntoGeografico getPunto()
	{
		String direccion = campoDireccion.getText().toString();

		if (direccion == null || direccion.equals(""))
		{
			if (!localizo)
				return null;

			return new PuntoGeografico(latitud, longitud);
		} else
		{
			PuntoGeografico punto = new PuntoGeografico(direccion);
			punto.setDireccion(direccion);
			return punto;
		}
	}
	
	private void comenzarLocalizacion()
	{
		// Obtenemos una referencia al LocationManager
		locManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

		// Obtenemos la última posición conocida
		loc = locManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);


		// Nos registramos para recibir actualizaciones de la posición
		locListener = new LocationListener()
		{
			public void onLocationChanged(Location location)
			{
				mostrarPosicion(location);
			}

			public void onProviderDisabled(String provider)
			{
				mostrarAvisoGpsDeshabilitado();
			}

			public void onProviderEnabled(String provider)
			{
				estado.setText("Localizando...");
				loc = locManager
						.getLastKnownLocation(LocationManager.GPS_PROVIDER);
				mostrarPosicion(loc);
			}

			public void onStatusChanged(String provider, int status,
					Bundle extras)
			{
				Log.i("LOG", "Provider Status: " + status);
			}
		};

		try
		{
			locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
					30000, 0, locListener);
		} catch (Exception e)
		{

		}
	}
	
	private class AgregarFavorito extends BaseAsync
	{
		private boolean seguir;
		private Favorito favorito;

		public AgregarFavorito(Favorito favorito)
		{
			super(RegistroFavoritoActivity.this, "Agragando...");
			this.favorito = favorito;
		}

		@Override
		protected Void doInBackground(Void... arg0)
		{
			
			Boolean respuesta = new ControladorPasajeros().agregarFavorito(new PreferencesHelper(
					getApplicationContext()).leerID(), favorito);
			
			Log.i("LOG","respuesta: " + respuesta);
			
			seguir = respuesta != null;

			return null;
		}

		@Override
		protected void onPostExecute(Void result)
		{
			super.onPostExecute(result);

			if (!seguir)
				Toast.makeText(RegistroFavoritoActivity.this, "Fallo la solicitud",
						Toast.LENGTH_SHORT).show();

			finish();
		}
	}
	
}
